package com.njaccp;

import java.io.File;
import java.lang.reflect.Field;
import java.util.Calendar;
import java.util.Date;

public class Reader {
    /**
     * 将对象转为字符串
     * @param obj   传入的对象
     * @return  JSON格式的字符串
     */
    public static String toJson(Object obj){
        String str = "{";
        //反射获取属性
        try {
            Field[] files = obj.getClass().getDeclaredFields();
            for (Field f : files) {
                f.setAccessible(true);
                if(f.getType().getSimpleName().equals("Date")){
                    //获取日期
                    Date dt = (Date) f.get(obj);
                    //日历类  处理日期型的数据
                    Calendar cal = Calendar.getInstance();
                    cal.setTime(dt);//设置日期
                    str+=f.getName()+":{year:"+cal.get(Calendar.YEAR)+",month:"+
                            cal.get(Calendar.MONDAY)+",date:"+
                            cal.get(Calendar.DATE)+",hour:"+
                            cal.get(Calendar.HOUR)+",minute:"+
                            cal.get(Calendar.MINUTE)+",second:"+
                            cal.get(Calendar.SECOND)+"},";
                }else {
                    str += f.getName() + ":" + f.get(obj) + ",";
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        str=str.substring(0,str.length()-1);
        str+="}";
        return str;
    }

    /**
     * 将JSON字符串转为对象
     * @param json  JSON字符串
     * @param cls    需要转成的类型
     * @param <T>    返回泛型值
     * @return
     */
    public static  <T> T parseObject(String json,Class cls){
        System.out.println(json);
        Object obj = null;
        try {
            //利用类型信息类，创建对象
            obj = null;
            obj = cls.newInstance();
            //JSON字符串最后加  ,
            json = json.substring(0,json.length()-1)+",}";
            //获取所有属性
            Field [] fields = cls.getDeclaredFields();
            for(Field f:fields){
                f.setAccessible(true);
    //            System.out.println(f.getName()+f.getType());
                //检查属性在字符串中是否有匹配的值
                if(json.indexOf(f.getName())!=-1) {
                    //获取属性在JSON字符串的位置
                    int start = json.indexOf(f.getName());//开始位置
                    int end = 0; //结束位置
                    //判断属性的类型
                    if (f.getType().getSimpleName().equals("Date")) {
                        end = json.indexOf("}",start)+1;
                        //取出对应的字符串
                        String res = json.substring(start,end);
                        //获取字符串后面的对象
                        res = res.replace(f.getName()+":","");
                        res = res.substring(1,res.length()-1);

                        //分割字符串
                        String []dates = res.split(",");
                        //将字符串数组再次分割只取值
                        Calendar cal = Calendar.getInstance();
                        int [] ds = new int[6];
                        for(int i=0;i<dates.length;i++){
                            ds[i] = Integer.parseInt(dates[i].split(":")[1]);
                        }
                        //将ds数组的值转为时间类型
                        cal.set(ds[0],ds[1],ds[2],ds[3],ds[4],ds[5]);
                        //将时间内类型的值为赋给对象属性
                        f.set(obj,cal.getTime());

                    } else {
                        end = json.indexOf(",",start);
                        //取出对应字符串
                        String res = json.substring(start,end);
                        //分割字符串获取值
                        String val = res.split(":")[1];
                        //根据属性类型填充对应属性值
                       if(f.getType().getSimpleName().equals("int")){
                           f.setInt(obj,Integer.parseInt(val));
                       }else if(f.getType().getSimpleName().equals("String")){
                           f.set(obj,val);
                       }
                    }
                }
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return (T) obj;
    }
}
